import abc
from torch import nn, Tensor
from typing import Tuple

class BaseArch(nn.Module, metaclass=abc.ABCMeta):
    """图片特征抽取网络父 module。任何一个被用来作为特征抽取的预训练网络都应该继承此类，
    然后实现 extract_features(x) 抽象方法。
    """

    def __init__(self):
        super(BaseArch, self).__init__()

    def forward(self, x: Tensor) -> Tuple[list, list]:
        return self.extract_features(x)

    @abc.abstractmethod
    def extract_features(self, x: Tensor) -> Tuple[list, list]:
        """图片的特征抽取。对给定的图片 Tensor 计算并返回对应的 "内容特征" 和 "风格特征"
        """
        pass
